package top.z.template;

import top.z.template.interpreter.AstInterpreter;
import top.z.template.parse.Ast;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * 渲染模板, 调用{@link Template#render}方法
 */
public class Template {

    private final List<Ast.Node> node;

    public Template(List<Ast.Node> node) {
        this.node = node;
        // this.macro = macro;
        // this.include = include;

        // for (Macro item : this.macro.values()) {
        //     item.setTemplate(this);
        // }
    }

    /**
     * 模板抽象语法树节点列表
     */
    public List<Ast.Node> getNode() {
        return this.node;
    }

    /**
     * 使用{@link Context}中的变量渲染模板
     */
    public String render(Context context) {
        ByteArrayOutputStream out = new ByteArrayOutputStream(2 * 1024);
        this.render(context, out);
        try {
            out.close();
            return out.toString(StandardCharsets.UTF_8);
        } catch (IOException e) {
            throw Error.error("Couldn't render template to string, " + e.getMessage(), node.get(0).getSpan());
        }
    }

    /**
     * 使用{@link Context}中的变量渲染模板
     */
    public Object render(Context context, OutputStream out) {
        return AstInterpreter.interpret(this, context, out);
    }

    /**
     * 使用{@link Context}中的变量计算模板
     */
    public Object evaluate(Context context) {
        return AstInterpreter.interpret(this, context, new OutputStream() {
            @Override
            public void write(int b) {
            }
        });
    }

}
